aboutsummaryrefslogtreecommitdiff
path: root/src/routes/grocery/[id]/+page.server.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/routes/grocery/[id]/+page.server.ts')
-rw-r--r--src/routes/grocery/[id]/+page.server.ts45
1 files changed, 32 insertions, 13 deletions
diff --git a/src/routes/grocery/[id]/+page.server.ts b/src/routes/grocery/[id]/+page.server.ts
index 656e19c..dbfecff 100644
--- a/src/routes/grocery/[id]/+page.server.ts
+++ b/src/routes/grocery/[id]/+page.server.ts
@@ -2,19 +2,18 @@ import { error, fail, redirect } from '@sveltejs/kit';
import { db } from '$lib/server/db';
import { groceries, categories } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
-import { loadAll as loadCategories } from '$lib/server/services/categories';
import {
- loadForGrocery,
- add as addRef,
- deleteReference,
-} from '$lib/server/services/references';
-import { updateGrocery, deleteGrocery } from '$lib/server/services/groceries';
-import { deleteByIdAction } from '$lib/server/services/grocery-actions';
+ categoriesService,
+ groceriesService,
+ referencesService,
+} from '$lib/server/services';
+import { idAction } from '$lib/server/services/grocery-actions';
import {
numericId,
parseFormString,
parseOptionalNumber,
} from '$lib/server/services/validation';
+import { isUniqueViolation } from '$lib/server/db/errors';
import type { Category, Grocery, Reference } from '$lib/server/services/types';
import type { Actions, PageServerLoad } from './$types';
@@ -37,8 +36,8 @@ export const load: PageServerLoad = async ({ params, url }) => {
.where(eq(categories.id, item.categoryId))
: [null];
- const refs = await loadForGrocery(id);
- const cats = await loadCategories();
+ const refs = await referencesService.loadForGrocery(id);
+ const cats = await categoriesService.loadAll();
const from = url.searchParams.get('from') || '/';
return {
@@ -65,12 +64,25 @@ export const actions: Actions = {
return fail(400, { error: 'La référence est requise' });
}
- await addRef(groceryId, reference, price, unit, qualityScore);
+ await referencesService.add(
+ groceryId,
+ reference,
+ price,
+ unit,
+ qualityScore,
+ );
return { success: true, type: 'add' as const };
},
delete: ({ request }) =>
- deleteByIdAction(request, deleteReference, { type: 'delete' }),
+ idAction(request, (id) => referencesService.deleteReference(id), {
+ type: 'delete',
+ }),
+
+ promote: ({ request }) =>
+ idAction(request, (id) => referencesService.promote(id), {
+ type: 'promote',
+ }),
update: async ({ request, params }) => {
const data = await request.formData();
@@ -83,13 +95,20 @@ export const actions: Actions = {
return fail(400, { error: 'Le nom est requis' });
}
- await updateGrocery(groceryId, name, categoryId);
+ try {
+ await groceriesService.updateGrocery(groceryId, name, categoryId);
+ } catch (error) {
+ if (isUniqueViolation(error)) {
+ return fail(400, { error: 'Un article porte déjà ce nom' });
+ }
+ throw error;
+ }
return { success: true, type: 'update' as const };
},
deleteItem: async ({ params, request }) => {
const groceryId = numericId(params.id);
- await deleteGrocery(groceryId);
+ await groceriesService.deleteGrocery(groceryId);
const data = await request.formData();
const from = parseFormString(data.get('from')) || '/';
throw redirect(303, from);